# """
# 统计指定目录下所有 Python 文件的代码行数
# """
# import os
#
#
# def count_lines_in_directory(directory):
#     total_lines = 0
#     for root, dirs, files in os.walk(directory):
#         for file in files:
#             if file.endswith('.py'):
#                 file_path = os.path.join(root, file)
#                 try:
#                     with open(file_path, 'r', encoding='utf-8') as f:
#                         lines = f.readlines()
#                         # 过滤掉空行和注释行（仅针对 Python 文件）
#                         code_lines = [line.strip() for line in lines if
#                                       line.strip() and not line.strip().startswith('#')]
#                         total_lines += len(code_lines)
#                 except FileNotFoundError:
#                     print(f"文件 {file_path} 未找到。")
#                 except Exception as e:
#                     print(f"读取文件 {file_path} 时出现错误: {e}")
#     return total_lines
#
#
# # 示例使用
# directory = r'C:\Users\zhang\Desktop\a'
# total_line_count = count_lines_in_directory(directory)
# print(f"目录 {directory} 下所有 Python 文件的代码行数为: {total_line_count}")
#
# # 目录 C:\Users\zhang\Desktop\源码\rest_framework 下所有 Python 文件的代码行数为: 12473
#
# # fastapi
# # 目录 C:\Users\Admin\Desktop\plans\fastapi\源码\fastapi 下所有 Python 文件的代码行数为: 15624  核心代码
# # 目录 C:\Users\Admin\Downloads\fastapi-master 下所有 Python 文件的代码行数为: 74257
#
# # django
# # 目录 C:\Users\Admin\Desktop\plans\django\django-main\django 下所有 Python 文件的代码行数为: 125102  核心代码
# # 目录 C:\Users\Admin\Downloads\django-main 下所有 Python 文件的代码行数为: 398996
#
# # 目录 C:\Users\Admin\Downloads\flask-main 下所有 Python 文件的代码行数为: 12944

import os


def count_python_code_lines(directory):
    """
    统计指定目录下所有Python文件的有效代码行数（排除空行、注释、文档字符串）

    Args:
        directory: 目标目录路径

    Returns:
        所有Python文件的有效代码总行数
    """
    total_lines = 0
    in_docstring = False  # 标记是否处于文档字符串中
    docstring_delimiters = {'"""', "'''"}  # 文档字符串分隔符

    for root, _, files in os.walk(directory):
        for file in files:
            if file.endswith('.py'):
                file_path = os.path.join(root, file)
                try:
                    with open(file_path, 'r', encoding='utf-8') as f:
                        lines = f.readlines()

                    file_code_lines = 0
                    current_in_doc = False  # 每个文件单独判断文档字符串状态

                    for line in lines:
                        stripped_line = line.strip()

                        # 处理文档字符串（判断是否进入/退出文档字符串）
                        if stripped_line in docstring_delimiters:
                            current_in_doc = not current_in_doc
                            continue  # 跳过文档字符串分隔符本身

                        # 若处于文档字符串中，直接跳过
                        if current_in_doc:
                            continue

                        # 过滤空行和单行注释
                        if not stripped_line or stripped_line.startswith('#'):
                            continue

                        # 有效代码行计数
                        file_code_lines += 1

                    total_lines += file_code_lines
                    # 可选：打印每个文件的统计结果，方便调试
                    # print(f"{file_path}: {file_code_lines} 行")

                except FileNotFoundError:
                    print(f"警告：文件 {file_path} 未找到")
                except UnicodeDecodeError:
                    print(f"警告：文件 {file_path} 编码不是utf-8，跳过处理")
                except Exception as e:
                    print(f"处理文件 {file_path} 时出错: {str(e)}")

    return total_lines


# 示例使用
if __name__ == "__main__":
    target_directory = r'C:\Users\zhang\Desktop\sync_api'
    if not os.path.isdir(target_directory):
        print(f"错误：目录 {target_directory} 不存在或不是有效目录")
    else:
        total = count_python_code_lines(target_directory)
        print(f"\n目录 {target_directory} 下所有Python文件的有效代码行数为: {total}")


# 目录 C:\Users\zhang\Desktop\sync_api 下所有Python文件的有效代码行数为: 8557
